import static org.junit.Assert.*;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;


public class TestMovimientoFantasma {

	@Before
	public void setUp() throws Exception {

		
	}

	@After
	public void tearDown() throws Exception {
	}

	@Test
	public void testMovimientoSimple() {
		Posicion posicion1 = new Posicion("0000", 0, 0);
		Posicion posicion2 = new Posicion("0100",1,0);
		posicion1.agregarAdjacente(Direccion.Abajo, posicion2);
		posicion1.agregarAdjacente(Direccion.Arriba, posicion1);
		Fantasma fantasma = new Zonzo(2, 10, posicion1);
		fantasma.setDireccionActual(Direccion.Abajo);
		fantasma.mover(posicion2);
		
		assertTrue(posicion2.Equals(fantasma.enDondeEstoy()));
	}
	@Test
	public void testFantasmaPersiguePacman() {
		Posicion posicion2 = new Posicion("0100",1,0);
		Posicion posicion3 = new Posicion("0101", 1, 1);
		Posicion posicion4 = new Posicion("0200",2,0);

		posicion2.agregarAdjacente(Direccion.Abajo, posicion4);
		posicion4.agregarAdjacente(Direccion.Arriba, posicion2);
		posicion2.agregarAdjacente(Direccion.Derecha, posicion3);
		posicion3.agregarAdjacente(Direccion.Izquierda, posicion2);
		Fantasma fantasma = new Zonzo(2, 10, posicion2);
		Pacman pacman = new Pacman(posicion3);
		fantasma.setDireccionActual(Direccion.Abajo);
		fantasma.mover(pacman.enDondeEstoy());
		
		assertTrue(posicion3.Equals(pacman.enDondeEstoy()));
	}
	
	@Test
	public void testFantasmaEscapaDePacman() {
		Posicion posicion2 = new Posicion("0100",1,0);
		Posicion posicion3 = new Posicion("0101", 1, 1);
		Posicion posicion4 = new Posicion("0200",2,0);

		posicion2.agregarAdjacente(Direccion.Abajo, posicion4);
		posicion4.agregarAdjacente(Direccion.Arriba, posicion2);
		posicion2.agregarAdjacente(Direccion.Derecha, posicion3);
		posicion3.agregarAdjacente(Direccion.Izquierda, posicion2);
		Fantasma fantasma = new Zonzo(2, 10, posicion2);
		fantasma.cambiarEstadoSiguiente(Evento.escapar);
		Pacman pacman = new Pacman(posicion3);
		fantasma.setDireccionActual(Direccion.Abajo);
		fantasma.mover(pacman.enDondeEstoy());
		
		assertTrue(posicion4.Equals(fantasma.enDondeEstoy()));
	}
	
	@Test
	public void testFantasmaVeAlPacman(){
		Posicion posicion2 = new Posicion("0100",1,0);
		Posicion posicion3 = new Posicion("0101", 1, 1);

		Fantasma fantasma = new Zonzo(2, 10, posicion2);
		Pacman pacman = new Pacman(posicion3);
		
		assertTrue(fantasma.loVe(pacman.enDondeEstoy()));
		
	}
	
	@Test
	public void testFantasmaNoVeAlPacman(){
		Posicion posicion2 = new Posicion("0100",1,0);
		Posicion posicion3 = new Posicion("0107", 1, 7);

		Fantasma fantasma = new Zonzo(2, 10, posicion2);
		Pacman pacman = new Pacman(posicion3);

		
		assertFalse(fantasma.loVe(pacman.enDondeEstoy()));
		
	}
	
	@Test
	public void testFantasmaEncuentraCaminoSinSalidaYVaParaAtras(){
		Posicion posicion1 = new Posicion("0207", 2, 7);
		Posicion posicion2 = new Posicion("0100",1,0);
		Posicion posicion3 = new Posicion("0200", 2, 0);
		
		posicion2.agregarAdjacente(Direccion.Abajo, posicion3);
		Fantasma fantasma = new Zonzo(2, 10, posicion2);
		fantasma.setDireccionActual(Direccion.Arriba);
		Pacman pacman = new Pacman(posicion1);
		fantasma.mover(pacman.enDondeEstoy());
		
		assertTrue(fantasma.enDondeEstoy().Equals(posicion3));
		
	}

}
